package com.note.feng.leetcode.algorithms.easy.ten;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ThousandTwo {
    /**
     * 1002 查找共用字符
     * 给你一个字符串数组 words ，请你找出所有在 words 的每个字符串中都出现的共用字符（ 包括重复字符），并以数组形式返回。你可以按 任意顺序 返回答案。
     *
     * 示例 1：
     *
     * 输入：words = ["bella","label","roller"]
     * 输出：["e","l","l"]
     * 示例 2：
     *
     * 输入：words = ["cool","lock","cook"]
     * 输出：["c","o"]
     *
     * 提示：
     *
     * 1 <= words.length <= 100
     * 1 <= words[i].length <= 100
     * words[i] 由小写英文字母组成
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/find-common-characters
     */
    /**
     * 解法：minCount 数组存储每个字符出现的最小次数；count 数组存储当前字符串中每个字符出现的次数；
     * 遍历完每个字符串后，都需要重新赋值 minCount，取每个字符的最小出现次数；
     * 最后遍历 minCount，字符出现几次，list 中需要添加几次元素
     * @param words
     * @return
     */
    public List<String> commonChars(String[] words) {
        List<String> list = new ArrayList<>();
        int [] minCount = new int [26];
        Arrays.fill(minCount, Integer.MAX_VALUE);
        for (String word : words){
            int [] count = new int [26];
            for (int i = 0; i < word.length(); i++) {
                count[word.charAt(i) - 'a'] ++;
            }
            for (int i = 0; i < 26; i++) {
                minCount[i] = Math.min(minCount[i], count[i]);
            }
        }
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < minCount[i]; j++) {
                list.add(String.valueOf((char)(i + 'a')));
            }
        }
        return list;
    }
}
